package com.uade.empresasdistribuidas.entities;

import java.sql.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name="tipo",discriminatorType=DiscriminatorType.STRING)
@Table(name= "Pedidos") 
public abstract class PedidoDTO {

	@Id 
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name = "nroPedido")
	private Long nroPedido;
	
	@Column(name="fechaMaxima", nullable=false)
	private Date fechaMaxima;
	
	@Column (name="manifiesto", nullable=false)
	private String manifiesto;
	
	@Column (name="nombreDestinatario", nullable=false)
	private String nombreDestinatario;
	
	@Column (name="documentoDestinatario", nullable=false)
	private String documentoDestinatario;
	
	@Column (name="estado", nullable=false)
	private String estado;
	
	@OneToMany(mappedBy="pedido",cascade = CascadeType.ALL)
	private List<CargaDTO> cargas;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "numeroCliente")
	private ClienteDTO cliente;
	
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="CodigoDireccion")
	private DireccionDTO direccion;
	
	@OneToOne (cascade=CascadeType.ALL, mappedBy="pedido")
	private FacturaDTO factura;
	
	@OneToOne (cascade=CascadeType.ALL, mappedBy="pedido")
	private ReciboDTO recibo;
	
	
	@OneToOne (cascade=CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="nroPedido")
	private PolizaDTO poliza;
	
	@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY,mappedBy="pedido")
	private List<RemitoDTO> remitos;
	
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="nroPedido")
	private RetiroMercaderiasDTO retiroMercaderias;
	
	@ManyToOne  
	@JoinColumn(name = "nroEnvio")  
	private EnvioDTO envio;
	
	
	
	public Long getNroPedido() {
		return nroPedido;
	}

	public void setNroPedido(Long nroPedido) {
		this.nroPedido = nroPedido;
	}


	public Date getFechaMaxima() {
		return fechaMaxima;
	}

	public void setFechaMaxima(Date fechaMaxima) {
		this.fechaMaxima = fechaMaxima;
	}

	public List<CargaDTO> getCargas() {
		return cargas;
	}

	public void setCargas(List<CargaDTO> cargas) {
		this.cargas = cargas;
	}

	public String getManifiesto() {
		return manifiesto;
	}

	public void setManifiesto(String manifiesto) {
		this.manifiesto = manifiesto;
	}

	public String getNombreDestinatario() {
		return nombreDestinatario;
	}

	public void setNombreDestinatario(String nombreDestinatario) {
		this.nombreDestinatario = nombreDestinatario;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public ClienteDTO getCliente() {
		return cliente;
	}

	public void setCliente(ClienteDTO cliente) {
		this.cliente = cliente;
	}

	public DireccionDTO getDireccion() {
		return direccion;
	}

	public void setDireccion(DireccionDTO direccion) {
		this.direccion = direccion;
	}

	public FacturaDTO getFactura() {
		return factura;
	}

	public void setFactura(FacturaDTO factura) {
		this.factura = factura;
	}

	public ReciboDTO getRecibo() {
		return recibo;
	}

	public void setRecibo(ReciboDTO recibo) {
		this.recibo = recibo;
	}

	public PolizaDTO getPoliza() {
		return poliza;
	}

	public void setPoliza(PolizaDTO poliza) {
		this.poliza = poliza;
	}

	public List<RemitoDTO> getRemitos() {
		return remitos;
	}

	public void setRemitos(List<RemitoDTO> remitos) {
		this.remitos = remitos;
	}

	public RetiroMercaderiasDTO getRetiroMercaderias() {
		return retiroMercaderias;
	}

	public void setRetiroMercaderias(RetiroMercaderiasDTO retiroMercaderias) {
		this.retiroMercaderias = retiroMercaderias;
	}

	public EnvioDTO getEnvio() {
		return envio;
	}

	public void setEnvio(EnvioDTO envio) {
		this.envio = envio;
	}
	
	

	public String getDocumentoDestinatario() {
		return documentoDestinatario;
	}

	public void setDocumentoDestinatario(String documentoDestinatario) {
		this.documentoDestinatario = documentoDestinatario;
	}
	
	public void addCarga(CargaDTO carga){
		cargas.add(carga);
	}

	public Float obtenerPesoPedido() {
		Float peso=0f;
		for (CargaDTO carga:this.getCargas()){
			peso=peso+carga.getPeso();
		}
		return peso;
	}
	
	
	public Integer getIdCliente() {
		
		return cliente.getNumeroCliente();
	}
	
	public boolean esRefrigerado(){
		boolean refrigerado=false;
		for (CargaDTO carga:this.getCargas()){
			if (carga.getRefrigeracion() != null && carga.getRefrigeracion()){
				refrigerado=true;
				break;
			}
		}
		
		return refrigerado;
	}

	public Float obtenerCostoEnvio() {
		
		return envio.getCostoEnvio();
	}

	public RemitoExternoDTO obtenerRemitoExterno() {
		for (RemitoDTO remito: remitos){
			if (remito instanceof RemitoExternoDTO){
				RemitoExternoDTO remitoResult=(RemitoExternoDTO)remito;
				return remitoResult;
			}
		}
		return null;
		
	}

	public RemitoDTO obtenerRemitoInterno() {
		for (RemitoDTO remito: remitos){
			if (remito instanceof RemitoInternoDTO){
				RemitoInternoDTO remitoResult=(RemitoInternoDTO)remito;
				return remitoResult;
			}
		}
		return null;
	}

	
}
